package com.wcs.exam.controller.api.biz;

import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.wcs.exam.common.base.BaseBiz;
import com.wcs.exam.common.base.Result;
import com.wcs.exam.common.enums.StatusEnum;
import com.wcs.exam.common.util.BeanUtil;
import com.wcs.exam.controller.api.resp.ApiCategoryResp;
import com.wcs.exam.dao.CategoryDao;
import com.wcs.exam.dao.impl.mapper.entity.Category;
import jakarta.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * Api-分类
 *
 * @author wcs
 */
@Component
@RequiredArgsConstructor
public class ApiCategoryBiz extends BaseBiz {

    @NotNull
    private final CategoryDao dao;

    /**
     * 分类列表
     *
     * @param categoryType 分类类型
     * @return 分类列表
     */
    public Result<List<ApiCategoryResp>> list(String categoryType) {
        // 根据分类类型、层级查询可用状态的课程分类集合
        LambdaQueryWrapper<Category> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(Category::getStatus, StatusEnum.NORMAL.getCode());
        wrapper.eq(StringUtils.hasText(categoryType), Category::getCategoryType, categoryType);
        wrapper.orderByAsc(Category::getSort).orderByDesc(Category::getId);
        return Result.success(filter(0L, dao.list(wrapper)));
    }


    /**
     * 根据父级分类ID递归过滤并构建分类树
     *
     * @param categoryList 原始分类列表
     * @param parentId     父级分类ID（根节点传默认父ID）
     * @return 包含层级结构的分类树
     */
    private List<ApiCategoryResp> filter(Long parentId, List<Category> categoryList) {
        List<Category> list = categoryList.stream().filter(item -> item.getParentId().compareTo(parentId) == 0).collect(Collectors.toList());
        if (CollUtil.isNotEmpty(list)) {
            // 转换实体并递归处理子节点
            List<ApiCategoryResp> respList = BeanUtil.copyProperties(list, ApiCategoryResp.class);
            for (ApiCategoryResp resp : respList) {
                // 递归构建子树
                resp.setChildren(filter(resp.getId(), categoryList));
            }
            return respList;
        }
        return new ArrayList<>();
    }
}
